#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MOD = 1000000007LL;
ll modpow(ll a, ll e=MOD-2){
ll r=1;
a %= MOD;
while(e){
if(e & 1) r = (r * a) % MOD;
a = (a * a) % MOD;
e >>= 1;
}
return r;
}
struct DSU {
int n;
vector<int> p, r;
DSU(int n=0): n(n), p(n), r(n,0) { iota(p.begin(), p.end(), 0); }
int find(int x){ return p[x]x?x:p[x]=find(p[x]); }
bool unite(int a,int b){
a=find(a); b=find(b);
if(ab) return false;
if(r[a]<r[b]) swap(a,b);
p[b]=a;
if(r[a]==r[b]) r[a]++;
return true;
}
};
struct Edge { int u,v; int w; };
ll det_mod_inplace(vector<vector<ll>>& A){ // A is n x n, compute det mod MOD
int n = (int)A.size();
ll det = 1;
for (int i = 0; i < n; ++i) {
int pivot = -1;
for (int r = i; r < n; ++r) if ((A[r][i] % MOD + MOD) % MOD != 0) { pivot = r; break; }
if (pivot == -1) return 0;
if (pivot != i) {
swap(A[pivot], A[i]);
det = (MOD - det) % MOD;
}
ll val = (A[i][i] % MOD + MOD) % MOD;
det = det * val % MOD;
ll inv = modpow(val);
// eliminate below
for (int r = i+1; r < n; ++r) {
if (A[r][i] == 0) continue;
ll factor = (A[r][i] % MOD + MOD) % MOD * inv % MOD;
// A[r][c] -= factor * A[i][c]
for (int c = i; c < n; ++c) {
ll t = (A[r][c] - factor * (A[i][c] % MOD + MOD) % MOD) % MOD;
A[r][c] = t;
}
}
}
return (det%MOD + MOD) % MOD;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N,K;
if(!(cin>>N>>K)) return 0;
// node id = iK + j
vector<Edge> edges;
edges.reserve(N(K-1) + (N-1)*K);
}